//给你一个下标从 0 开始的整数数组 nums 。 
//
// 请你从所有满足 i < j < k 的下标三元组 (i, j, k) 中，找出并返回下标三元组的最大值。如果所有满足条件的三元组的值都是负数，则返回 0 
//。 
//
// 下标三元组 (i, j, k) 的值等于 (nums[i] - nums[j]) * nums[k] 。 
//
// 
//
// 示例 1： 
//
// 
//输入：nums = [12,6,1,2,7]
//输出：77
//解释：下标三元组 (0, 2, 4) 的值是 (nums[0] - nums[2]) * nums[4] = 77 。
//可以证明不存在值大于 77 的有序下标三元组。
// 
//
// 示例 2： 
//
// 
//输入：nums = [1,10,3,4,19]
//输出：133
//解释：下标三元组 (1, 2, 4) 的值是 (nums[1] - nums[2]) * nums[4] = 133 。
//可以证明不存在值大于 133 的有序下标三元组。 
// 
//
// 示例 3： 
//
// 
//输入：nums = [1,2,3]
//输出：0
//解释：唯一的下标三元组 (0, 1, 2) 的值是一个负数，(nums[0] - nums[1]) * nums[2] = -3 。因此，答案是 0 。
// 
//
// 
//
// 提示： 
//
// 
// 3 <= nums.length <= 10⁵ 
// 1 <= nums[i] <= 10⁶ 
// 
//
// Related Topics 数组 👍 43 👎 0


package LeetCode.editor.cn;


/**
 * @author ldltd
 * @date 2025-04-03 09:51:30
 * @description 2874.有序三元组中的最大值 II
 
 */
 
public class MaximumValueOfAnOrderedTripletIi {
    public static void main(String[] args) {
    //测试代码
    MaximumValueOfAnOrderedTripletIi fun = new MaximumValueOfAnOrderedTripletIi();
    Solution solution= fun.new Solution();
    
    }

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {

    //贪心考虑的话，需要 a c 尽量大，b尽量小
    //双指针扫 时间 o n^2
    public long maximumTripletValue1(int[] nums) {
        int n = nums.length;
        long res = 0;
        for (int k = 2; k < n; k++) {
            //固定k，然后遍历k的左区间，每次移动j，并且延迟更新l
            int m = nums[0];
            for (int j = 1; j < k; j++) {
                res = Math.max(res, (long)(m - nums[j]) * nums[k]);
                m = Math.max(m, nums[j]);
            }
        }
        return res;
    }
    //固定j，时只要i k最大，结果最大，维护两个数组 l r，是位置 ind的最大值，
    public long maximumTripletValue(int[] nums) {
        int n = nums.length;
        long res = 0;
        long [] l=new long[n];
        long [] r=new long[n];
        for (int k = 1; k < n; k++) {
            l[k]=Math.max(l[k-1],nums[k-1]);
            r[n-k-1]=Math.max(r[n-k],nums[n-k]);
        }
        for (int i = 0; i < n; i++) {
            res=Math.max(res,(l[i]-nums[i])*r[i]);
        }
        return res;
    }
    //贪心，一次遍历，维护i 和i-j
    public long maximumTripletValue2(int[] nums) {
        int n = nums.length;
        long res = 0,imax=0,dmax=0;
        for (int i = 0; i < n; i++) {
            res=Math.max(res,dmax*nums[i]);
            dmax=Math.max(dmax,imax-nums[i]);
            imax=Math.max(imax,nums[i]);
        }
        return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}
